package com.springday3aoptest1.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component // 声明是一个Spring组件，如果不声明切面功能会失效
@Aspect // 声明是一个切面类
public class MyAdvice {

    //    配置切入点
    @Pointcut("execution(* com.springday3aoptest1.service.*Service.*(..))")
    private void servicePt() {
    }

    //    配置环绕通知
    @Around("servicePt()")
    public void runSpeed(ProceedingJoinPoint pjp) throws Throwable {

//        获取执行签名信息
        Signature signature = pjp.getSignature();
//        通过签名获取执行的接口名
        String className = signature.getDeclaringTypeName();
//        通过签名获取执行的方法名
        String methodName = signature.getName();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            pjp.proceed();
        }
        long end = System.currentTimeMillis();
        System.out.println("业务层接口方法" + className + "." + methodName + "万次执行时间: 业务层接口万次执行时间: " + (end - start) + "ms");
    }

}
